package com.lingjtx.im.core.protocol;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import org.springframework.stereotype.Component;

/**
 * 编码器（将 ProtocolWrapper 转为二进制）
 */
@ChannelHandler.Sharable
@Component
public class ProtocolEncoder extends MessageToByteEncoder<ProtocolWrapper> {
    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, ProtocolWrapper wrapper, ByteBuf out) throws Exception {
        // 1. 序列化 Protobuf 消息体
        byte[] bodyBytes = wrapper.getMessage().toByteArray();

        // 2. 写入协议头（魔数、版本、消息类型、消息体长度）
        out.writeInt(wrapper.getMagic());       // 魔数（4字节）
        out.writeByte(wrapper.getVersion());  // 版本（1字节）
        out.writeByte(wrapper.getImType());  // 消息类型（1字节）
        out.writeInt(bodyBytes.length);       // 消息体长度（4字节）

        // 3. 写入消息体
        out.writeBytes(bodyBytes);
    }
}
